function animate(obj, target, callback) {
    // console.log(callback);  callback = function() {}  调用的时候 callback()

    // 先清除以前的定时器，只保留当前的一个定时器执行
    clearInterval(obj.timer);
    obj.timer = setInterval(function () {
        // 步长值写到定时器的里面
        // 把我们步长值改为整数 不要出现小数的问题
        // var step = Math.ceil((target - obj.offsetLeft) / 10);
        var step = (target - obj.offsetLeft) / 10;
        step = step > 0 ? Math.ceil(step) : Math.floor(step);
        if (obj.offsetLeft == target) {
            // 停止动画 本质是停止定时器
            clearInterval(obj.timer);
            // 回调函数写到定时器结束里面
            // if (callback) {
            //     // 调用函数
            //     callback();
            // }

            // 11.3 如果有回调,调用
            callback && callback();
        }
        // 把每次加1 这个步长值改为一个慢慢变小的值  步长公式：(目标值 - 现在的位置) / 10
        obj.style.left = obj.offsetLeft + step + 'px';

    }, 15);
}


window.addEventListener('load', function () {

    var btnL = document.querySelector('.btn_left');
    var btnR = document.querySelector('.btn_right');
    let focus = document.querySelector('li');
    let banner = this.document.querySelector('.banner');

    let focusWidth = focus.offsetWidth;
    let ul = this.document.querySelector('ul');
    let num = 0;
    var flag = true;

    // 7. 控制小圆圈的变化，在按钮点了后，下面圆点也要跑
    let circle = 0;

    // 2、鼠标移入li的时候，两边剪头按钮隐藏；
    banner.addEventListener('mouseenter', function () {
        btnL.style.display = 'block';
        btnR.style.display = 'block';
        // 10.1 鼠标移入的时候就不自动轮播
        clearInterval(timer);
        // 10.2 清除定时器变量，不知道为何
        // timer = null;
    });
    // 2.1 鼠标移出li的时候，两边剪头按钮显示；
    banner.addEventListener('mouseleave', function () {
        btnL.style.display = 'none';
        btnR.style.display = 'none';

        // 10.3 移出再来
        let timer = setInterval(function () {
            // 手动调用点击事件
            btnR.click();
        }, 2000);
    });

    // 3、动态生成小圆圈
    let ol = this.document.querySelector('.circle');

    for (let i = 0; i < ul.children.length; i++) {
        let li = document.createElement('li');

        // 3.1 记录当前小圆圈的索引号，通过自定义属性来做
        li.setAttribute('index', i);
        // 3.2 把li插入ol
        ol.appendChild(li);

        // 4. 小圆圈排他
        li.addEventListener('click', function () {

            for (let i2 = 0; i2 < ol.children.length; i2++) {
                // 4.2 这里是清除所有类名，也是视频上面的
                // 但我觉得，我们只能清除特定的类名current
                // ol.children[i].className = '';

                // 4.3 删除current
                ol.children[i2].classList.remove('current');
                // console.log(i); 打印i会炸；
            }

            // 4.1 留下自己
            this.className += 'current';

            // 5、点击小圆圈，移动图片
            let index = this.getAttribute('index');
            animate(ul, -index * ul.offsetWidth);

            // 8、BUG1
            num = parseInt(index);
            // 8.2 图片好了后，还有小圆点的没有变；
            circle = parseInt(index);
            // console.log(circle);
            // 5.1 数据出错打印ul.offsetHeight
            // console.log(ul.offsetHeight);
            // 5.2 打印出来是455；不是720；只有一半；打印：-index * ul.offsetHeight
            // console.log(-index);
            // 5.3 -index是没问题的，查找offsetHeight概念；哦找到了这不是width

        });


    }

    // 4-2
    // let a = document.createElement('div');
    // ol.appendChild(a);
    // console.log(ol)
    // console.log(ol.children);
    // console.log(ol.children.length);
    // console.log(ol.length);

    // 3.3 把第一个设置类名为current;
    ol.children[0].className += 'current';

    // 6、按钮
    function btn() {
        // 6.1 克隆第一张图片(li)放到ul 最后面
        var first = ul.children[0].cloneNode(true);
        ul.appendChild(first);

        // 9.6 封装小圆圈变化
        function circleChange() {
            // 7.2 先清除其余小圆圈的current类名
            for (let i = 0; i < ol.children.length; i++) {
                ol.children[i].classList.remove('current');
            }

            // 7.3 留下当前的小圆圈的current类名
            ol.children[circle].classList.add('current');
        }


        btnR.addEventListener('click', function () {

            // 11. 节流阀
            if (flag) {
                flag = false; // 11.1 关闭节流阀
                // 如果走到了最后复制的一张图片，此时 我们的ul 要快速复原 left 改为 0
                if (num == ul.children.length - 1) {
                    ul.style.left = 0;
                    num = 0;
                }
                num++;

                animate(ul, -num * focusWidth, function () {
                    flag = true; // 11.2 打开节流阀
                });

                // 7.1 点击右侧，circle也跟着加
                circle++;


                // 7.4 如果circle等于最大length，说明走到克隆了，要复原
                if (circle == ol.children.length) {
                    circle = 0;
                }

                circleChange()

                // console.log(circle);
            }
        });

        // 9. 左侧按钮，先复制右侧
        btnL.addEventListener('click', function () {
            if (flag) {
                flag = false; // 关闭节流阀

                // 9.2 走到第一张，快速跑到 最后一张，num=0的时候不会触发，而是点击后才会
                if (num == 0) {
                    // 9.3 因为是滑到每张图最左边，所以-1；
                    num = ul.children.length - 1;
                    ul.style.left = -num * focusWidth + 'px';

                }
                // 9.1 --
                num--;

                animate(ul, -num * focusWidth, function () {
                    flag = true; // 打开节流阀
                });

                // 9.4 
                circle--;


                // 7.4 如果circle等于最大length，说明走到克隆了，要复原
                /* if (circle == ol.children.length) {
                    circle = 0;
                } */
                // 9.5 如果circle<0，说明第一张图片，则小圆圈要改为第4个小圆圈（3）
                // 9.7 改为三元表达式
                /* if (circle < 0) {
                    circle = ol.children.length - 1;
                } */
                circle = circle < 0 ? ol.children.length - 1 : circle;

                circleChange();
                // console.log(circle);
            }
        });
    }
    btn();

    // 10、自动播放轮播图
    let timer = setInterval(function () {
        // 手动调用点击事件
        btnR.click();
    }, 2000);
});

